約 5,714,563 件
https://w.atwiki.jp/cocoareferencejp/pages/82.html
Tags コアサービス フレームワーク リファレンス 未完 トップ フレームワーク Foundation Framework Foundation Frameworkリファレンス 翻訳元 このページの最終更新:2010-01-31 ADCの最終更新:2009-08-28 イントロダクション? フレームワーク /System/Library/Frameworks/Foundation.framework ヘッダーファイルのディレクトリ /System/Library/Frameworks/Foundation.framework/Headers コンパニオンガイド Cocoa Fundamentals GuideFoundation Release Notes クラスリファレンス NSAffineTransform NSAppleEventDescriptor? NSAppleEventManager? NSAppleScript? NSArchiver? NSArray NSAssertionHandler? NSAttributedString? NSAutoreleasePool NSBlockOperation NSBundle NSCachedURLResponse? NSCalendar? NSCharacterSet? NSClassDescription? NSCloneCommand? NSCloseCommand? NSCoder NSComparisonPredicate? NSCompoundPredicate? NSCondition? NSConditionLock? NSConnection? NSCountCommand? NSCountedSet? NSCreateCommand? NSData NSDate? NSDateComponents? NSDateFormatter? NSDecimalNumber? NSDecimalNumberHandler? NSDeleteCommand? NSDeserializer? NSDictionary NSDirectoryEnumerator? NSDistantObject? NSDistantObjectRequest? NSDistributedLock? NSDistributedNotificationCenter? NSEnumerator? NSError NSException NSExistsCommand? NSExpression? NSFileHandle? NSFileManager NSFormatter? NSGarbageCollector? NSGetCommand? NSHashTable? NSHost? NSHTTPCookie? NSHTTPCookieStorage? NSHTTPURLResponse? NSIndexPath? NSIndexSet NSIndexSpecifier? NSInputStream? NSInvocation NSInvocationOperation? NSKeyedArchiver? NSKeyedUnarchiver? NSLocale? NSLock? NSLogicalTest? NSMachBootstrapServer? NSMachPort? NSMapTable? NSMessagePort? NSMessagePortNameServer? NSMetadataItem? NSMetadataQuery? NSMetadataQueryAttributeValueTuple? NSMetadataQueryResultGroup? NSMethodSignature? NSMiddleSpecifier? NSMoveCommand? NSMutableArray? NSMutableAttributedString? NSMutableCharacterSet? NSMutableData? NSMutableDictionary? NSMutableIndexSet? NSMutableSet? NSMutableString? NSMutableURLRequest? NSNameSpecifier? NSNetService? NSNetServiceBrowser? NSNotification? NSNotificationCenter? NSNotificationQueue? NSNull NSNumber NSNumberFormatter? NSObject NSOperation? NSOperationQueue? NSOrthography? NSOutputStream? NSPipe? NSPointerArray? NSPointerFunctions? NSPort? NSPortCoder? NSPortMessage? NSPortNameServer? NSPositionalSpecifier? NSPredicate? NSProcessInfo? NSPropertyListSerialization? NSPropertySpecifier? NSProtocolChecker? NSProxy? NSQuitCommand? NSRandomSpecifier? NSRangeSpecifier? NSRecursiveLock? NSRelativeSpecifier? NSRunLoop? NSScanner? NSScriptClassDescription? NSScriptCoercionHandler? NSScriptCommand? NSScriptCommandDescription? NSScriptExecutionContext? NSScriptObjectSpecifier? NSScriptSuiteRegistry? NSScriptWhoseTest? NSSerializer? NSSet? NSSetCommand? NSSocketPort? NSSocketPortNameServer? NSSortDescriptor? NSSpecifierTest? NSSpellServer? NSStream? NSString NSTask? NSTextCheckingResult? NSThread? NSTimer? NSTimeZone? NSUnarchiver? NSUndoManager? NSUniqueIDSpecifier? NSURL? NSURLAuthenticationChallenge? NSURLCache? NSURLConnection? NSURLCredential? NSURLCredentialStorage? NSURLDownload? NSURLHandle? NSURLProtectionSpace? NSURLProtocol? NSURLRequest? NSURLResponse? NSUserDefaults NSValue NSValueTransformer? NSWhoseSpecifier? NSXMLDocument? NSXMLDTD? NSXMLDTDNode? NSXMLElement? NSXMLNode NSXMLParser? プロトコルリファレンス NSCoding NSComparisonMethods? NSConnectionDelegate? NSCopying NSDecimalNumberBehaviors? NSErrorRecoveryAttempting? NSFastEnumeration? NSKeyedArchiverDelegate? NSKeyedUnarchiverDelegate? NSKeyValueCoding? NSKeyValueObserving? NSLocking NSMachPortDelegate? NSMetadataQueryDelegate? NSMutableCopying NSNetServiceBrowserDelegate? NSNetServiceDelegate? NSObjCTypeSerializationCallBack? NSObject NSPortDelegate? NSScriptingComparisonMethods? NSScriptKeyValueCoding? NSScriptObjectSpecifiers? NSSpellServerDelegate? NSStreamDelegate? NSURLAuthenticationChallengeSender? NSURLHandleClient? NSURLProtocolClient? NSXMLParserDelegate? その他のリファレンス Foundation Functions Foundation Data Types Foundation Constants?
https://w.atwiki.jp/atachi/pages/53.html
.NET Frameworksの各サブコンテンツ 文字列 日付時刻 オブジェクト コレクション ファイルシステム スレッド Tips 設定の保存と復帰
https://w.atwiki.jp/knowledgebase/pages/15.html
EntityFrameworkについて インストール EF5 バックエンドデータベース Code Firstプログラミング サンプルソース DbContext エンティティクラス 型 日付(DateTime) 複合型フィールド 外部関連 モデルの階層化(TPT) 属性 データベースの設定 エンティティの使い方 エンティティの追加 エンティティの削除 LINQを使ったエンティティの検索方法 エンティティのキーから検索 ジェネリックな方法でプロパティにアクセス 関連 関連エンティティの積極的読み込み 関連エンティティの遅延読み込み 遅延読み込み無効化 ライフサイクル EntityState.Add EntityState.Detached ローカルデータ(未コミットデータ) 低レベルSQLの実行 参照 プログラミング EntityFrameworkについて http //msdn.microsoft.com/ja-jp/library/bb386871%28v=vs.90%29.aspx EntityFramework 5 VisualStudio2010とVisualStudio2012に対応。 EntityFramework 5 Beta 2012年3月29日 VisualStudio11に対応。また、VisualStudio2010ではエラーが発生するため、まだ動作しない。 EntityFramework 4.3.1 2012年3月29日 インストール VisualStudioから使用する場合、VisualStudioのExtensionであるNuGetManagerを使います。 VisualStudio2010では拡張機能であるNuGetPackageManagerを導入すれば、VisualStudio内からパッケージの取得・管理を行うことができる。 EF5 NotMapped属性の仕様が変更。 バックエンドデータベース SQL Server Compact 4.0 Microsoft SQL Server Compact 4.0 は、ソフトウェア開発者が ASP.NET Web サイトの構築と Windows デスクトップ アプリケーションの作成に使用できる、無償の埋め込み型データベースです。SQL Server Compact 4.0 はコンパクトで、アプリケーション フォルダー内にバイナリ ファイルをプライベート配置することができ、Visual Studio と WebMatrix を使用してアプリケーションを簡単に開発でき、スキーマとデータを SQL Server にシームレスに移行できます。 Code Firstプログラミング Code Firstプログラミングとは、データベースを使うにあたってのデータ構造をSQLや別のツールを使ってあらかじめ構築することなく、C#のオブジェクト指向プログラミングで定義されたクラスをそのままデータ構造として使うプログラミング方法です。 EntityFrameworksでは使用するクラスを元にデータ構造を構築し、データベースの作成します。 PlainOldなクラスをデータモデルクラスに使用できる(POCOと同じ) CoC(convention over configuration) (Wikipedia 設定より規約) IDEが持つデザイナやXMLによる、マッピング記述が不必要 バックエンドのデータソースとしてSQLServerCEバージョン4.0を使用しています。 サンプルソース namespace Magic.Unicorn { public class Princess IPerson { public int Id { get; set; } public string Name { get; set; } public virtual ICollection Unicorns { get; set; } public virtual ICollection LadiesInWaiting { get; set; } } public class Unicorn { public int Id { get; set; } public string Name { get; set; } [Timestamp] public byte[] Version { get; set; } public int PrincessId { get; set; } // FK for Princess reference public virtual Princess Princess { get; set; } } public class Castle { [Key] public string Name { get; set; } public Location Location { get; set; } public virtual ICollection LadiesInWaiting { get; set; } } [ComplexType] public class Location { public string City { get; set; } public string Kingdom { get; set; } public ImaginaryWorld ImaginaryWorld { get; set; } } [ComplexType] public class ImaginaryWorld { public string Name { get; set; } public string Creator { get; set; } } public class LadyInWaiting IPerson { [Key, Column(Order = 0)] [DatabaseGenerated(DatabaseGeneratedOption.None)] public int PrincessId { get; set; } // FK for Princess reference [Key, Column(Order = 1)] public string CastleName { get; set; } // FK for Castle reference public string FirstName { get; set; } public string Title { get; set; } [NotMapped] public string Name { get { return String.Format( {0} {1} , Title, FirstName); } } public virtual Castle Castle { get; set; } public virtual Princess Princess { get; set; } } public interface IPerson { string Name { get; } } public class UnicornsContext DbContext { public DbSet Unicorns { get; set; } public DbSet Princesses { get; set; } public DbSet LadiesInWaiting { get; set; } public DbSet Castles { get; set; } } public class UnicornsContextInitializer DropCreateDatabaseAlways { protected override void Seed(UnicornsContext context) { var cinderella = new Princess { Name = Cinderella }; var sleepingBeauty = new Princess { Name = Sleeping Beauty }; var snowWhite = new Princess { Name = Snow White }; new List { new Unicorn { Name = Binky , Princess = cinderella }, new Unicorn { Name = Silly , Princess = cinderella }, new Unicorn { Name = Beepy , Princess = sleepingBeauty }, new Unicorn { Name = Creepy , Princess = snowWhite }, //new Unicorn { Name = No Princess } // 外部関連であるPrincessを未設定にはできない。 }.ForEach(u = context.Unicorns.Add(u)); var efCastle = new Castle { Name = The EF Castle , Location = new Location { City = Redmond , Kingdom = Rainier , ImaginaryWorld = new ImaginaryWorld { Name = Magic Unicorn World , Creator = ADO.NET } }, }; new List { new LadyInWaiting { Princess = cinderella, Castle = efCastle, FirstName = Lettice , Title = Countess }, new LadyInWaiting { Princess = sleepingBeauty, Castle = efCastle, FirstName = Ulrika , Title = Lady }, new LadyInWaiting { Princess = snowWhite, Castle = efCastle, FirstName = Yolande , Title = Duchess } }.ForEach(l = context.LadiesInWaiting.Add(l)); } } public class Program { public static void Main(string[] args) { Database.SetInitializer(new UnicornsContextInitializer()); var context = new UnicornsContext(); // Many of the code fragments can be run by inserting them here } } } DbContext DbContextはEntityFrameworkをつかってバックエンドデータベースと関連付けされたDbSetを管理するクラスです。 br DbSetのインスタンスは自動的にDbContext内でオブジェクトが設定されます。このオブジェクトは再設定することはないので、後述のようなGetterプロパティのみを公開したIDbSet型のプロパティを使います。 public class UnicornsContext DbContext { public DbSet Unicorns { get; set; } public DbSet Princesses { get; set; } public DbSet LadiesInWaiting { get; set; } public DbSet Castles { get; set; } } // または、下記のようにIDbSetを使ったプロパティ public class UnicornsContext DbContext { public IDbSet Unicorns { get; set; } public IDbSet Princesses { get; set; } public IDbSet LadiesInWaiting { get; set; } public IDbSet Castles { get; set; } } ContextのDbSetオブジェクトは再設定する必要がないため、Getterプロパティのみ公開するプロパティがもっとも理想です。 Setメソッドは、DbContext.Setメソッドとして実装しており、この関数はDbSet T を返すメソッドです。 public class UnicornsContext DbContext { public IDbSet Unicorns { get { return Set(); } } public IDbSet Princesses { get { return Set(); } } public IDbSet LadiesInWaiting { get { return Set(); } } public IDbSet Castles { get { return Set(); } } } エンティティクラス 型 日付(DateTime) DateTime型のフィールドです。 Nullを指定してもよい場合は、明示的にNull許容型のDataTime型として定義しなければなりません。 public class TestEntity { // Nullは指定できない。 // また、値は必ず設定する必要がある。 public DateTime NotNullDate{get; set;} // Nullは指定可能。 // 値は設定しない場合、自動的にNullになる。 public DateTime? NullDate{get;set;} } NotNullateはNullにすることはできないため、TestEntityのオブジェクトを作成したら必ず有効な値を設定しなければなりません。 複合型フィールド シリアライズ可能なクラスを値型としてEntityFrameworksに認識させることで、1つのテーブルのフィールドとして構築することができます。 次のような場合、CastleクラスのテーブルにはLocationクラスのフィールドが含まれます。 public class Castle { [Key] public string Name { get; set; } public Location Location { get; set; } public virtual ICollection LadiesInWaiting { get; set; } } [ComplexType] public class Location { public string City { get; set; } public string Kingdom { get; set; } public ImaginaryWorld ImaginaryWorld { get; set; } } [ComplexType] public class ImaginaryWorld { public string Name { get; set; } public string Creator { get; set; } } 外部関連 Princessプロパティは自動的にPrincessIdフィールドを外部キーとして外部関連エンティティを構築します。 br Prinsessプロパティで取得できるオブジェクトは、DbContextにより外部キーによって遅延読み込みが発生し、Princessプロパティアクセス時にデータベースから値が取得されエンティティを返します。 public class Unicorn { public int Id { get; set; } public string Name { get; set; } [Timestamp] public byte[] Version { get; set; } public int PrincessId { get; set; } // FK for Princess reference public virtual Princess Princess { get; set; } } 実際のUnicornテーブルのカラムは次のようになります。 int Id byte[] Version int PrincessId モデルの階層化(TPT) http //weblogs.asp.net/manavi/archive/2010/12/28/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt.aspx 属性 KeyAttribute[Key] モデルの主キーとなるプロパティを指定する。 StringLengthAttribute[StringLength(XXX)] MaxLengthAttribute[MaxLength(XXX)] string型の場合、フィールドの最大文字数を設定します。MinLengthは未実装? ConcurrencyCheckAttribute[ConcurrencyCheck] データ検証を有効にするプロパティにマークする。 RequiredAttribute[Required] NULLを設定できないプロパティであることをマークする。 TimestampAttribute[Timestamp] タイムスタンプ情報を格納するフィールドであることを指定する。このフィールドはモデルクラスではbyte[]でマッピングします。 ComplexTypeAttribute[ComplexType] モデルに含むことができる複合データクラスである場合に指定する。クラス定義にのみ指定可能。この属性を設定したクラスは、データベースにシリアライズ化されて保存可能となります。ただし、複合データクラスは公開プロパティにプリミティブ型か他の複合データクラスしかメンバ変数に含むことはできません。 ColumnAttribute[Column] TableAttribute[Table] テーブル作成に関する情報を設定する。Nameプロパティは、作成するテーブル名を任意のものに設定します。 InversePropertyAttribute [InverseProperty] ForeignKeyAttribute [ForeignKey] DatabaseGeneratedAttribute [DatabaseGenerated] NotMappedAttribute [NotMapped] データベースの設定 App.configやWeb.configに使用するデータベースの種類などを設定します。 br 設定項目は使用するデータベース毎に異なるため、使用するデータベースのマニュアル等を参考にします。 記述した設定情報は、DbContextのコンストラクタで指定することで使用できます。 public class UnicornsContext DbContext { public UnicornsContext() base( UnicornsCEDatabase ) // または、次のように項目名を指定した記述も可能 // base( name=UnicornsCEDatabase ) { } } エンティティの使い方 エンティティの追加 エンティティのDbSetコレクションに新しいエンティティを追加して、DbContext.SaveChanges()を呼び出すことでデータが保存(アタッチ)されます。 context.Unicorns.Add(new Unicorn { Id = -1 ,Name= bbb }); context.Unicorns.Add(new Unicorn { Name = ccc }); context.SaveChanges(); 注意点として、DbContext.SaveChanges()を呼び出していない状態でも内部的にデータが保存される段階となることを忘れてはいけません。 context.Unicorns.Add(new Unicorn { Id = -1 ,Name= bbb }); context.Unicorns.Add(new Unicorn { Name = ccc }); DumpUnicornTest(context); // 何も出力されない context.SaveChanges(); DumpUnicornTest(context); // 上で追加した2つのUnicornレコードをダンプする また、UnicornはIdがint型となっており、自動的にAutoIncrementが設定されているため、Unicornsに要素を追加した順にIdが割り振られます。 br 上記のようにIdに「-1」という設定できない値や、未設定の場合でも正常な値を割り振ります。この動作はDbContext.SaveChanges()を実行した段階で行われます。 次のコードはDbContext.SaveChanges()を呼び出す前はIDが「-1」のレコードを見つけることができるが、DbContext.SaveChanges()を呼び出した後は見つけることができません。 context.Unicorns.Add(new Unicorn { Id = -1 ,Name= bbb }); var newUnicorn = context.Unicorns.Find(-1); if(newUnicorn != null) { Console.WriteLine( Idが-1のUnicornが存在する ); } context.SaveChanges(); var newUnicorn2 = context.Unicorns.Find(-1); if(newUnicorn2 == null) { Console.WriteLine( UnicornはNULLです ); } Console.WriteLine( newUnicornのID= + newUnicorn.Id); // IDは「-1」ではなく、DbContext.SaveChanges()で割り振られた新しいIDになっている。 エンティティの削除 DbSet.Removeにエンティティを削除するオブジェクトを与えます。 context.Unicorns.Remove(context.Unicorns.Find(1)); LINQを使ったエンティティの検索方法 DbSetはそのままLINQで使用可能なコレクションとして使用できるので、次のようなLINQを記述できます。 var unicorns = from u in context.Unicorns where u.Name.StartsWith( B ) select u; エンティティのキーから検索 エンティティの主キーで検索を行う場合は、取得したいエンティティのDbSet.Findメソッドで行います。 br 複合キーを持つエンティティの場合、モデル定義時に指定したカラムの順番に引数を指定します。 var unicorn = context.Unicorns.Find(3); // ID=3のエンティティを取得する。 var castle = context.Castles.Find( The EF Castle ); // IDが文字列型の場合でも、取得できます。 var lady = context.LadiesInWaiting.Find(3, The EF Castle ); // エンティティが複合キーを定義している場合でも、可変引数を使用することで取得可能。 ジェネリックな方法でプロパティにアクセス var unicorn = context.Unicorns.Find(3); // Read the current value of the Name property string currentName1 = context.Entry(unicorn).Property(u = u.Name).CurrentValue; // 普通に「unicorn.Name」へアクセスする意味と同じ。 Console.WriteLine( Name={0} , currentName1); context.Entry(unicorn).Property(u = u.Name).CurrentValue = Franky ; // Setterも同じ。 // ◆文字列によるプロパティへのアクセスも可能。 object currentName2 = context.Entry(unicorn).Property( Name ).CurrentValue; // Getter呼び出し context.Entry(unicorn).Property( Name ).CurrentValue = Squeaky ; // Setter呼び出し エンティティのプロパティ名を指定しなくても、プロパティの名前や値を巡回できます。 var unicorn = context.Unicorns.Find(3); DbPropertyValues pvals = context.Entry(unicorn).CurrentValues; foreach(var propertyName in pvals.PropertyNames) { // すべてのプロパティをダンプ Console.WriteLine( Property {0} has value {1} , propertyName, pvals[propertyName]); // pvals[propertyName]への代入も可能。 } エンティティにComplexTypeに設定されたクラスを持つフィールドがある場合、次のような方法でアクセスが可能です。 var castle = context.Castles.Find( The EF Castle ); // CastleクラスのLocationプロパティはComplexType属性が設定されたLocationクラス var location = context.Entry(castle) .Property(c = c.Location) .CurrentValue; // locationはLocationオブジェクト var world1 = context.Entry(castle) .Property(c = c.Location.ImaginaryWorld) .CurrentValue; // この呼び出し方法ができるのは、当たり前といえば当たり前。 var world2 = context.Entry(castle) .ComplexProperty(c = c.Location) // ComplexTypeであるLocationにアクセス .Property(l = l.ImaginaryWorld) // Location.ImaginaryWordにアクセス .CurrentValue; // ComplexTypeのプロパティへアクセスする場合は、ComplexPropertyを使う。 // 前項の方法でもImaginaryWorldにアクセスできるので、わざわざComplexPropertyを使う必要はない気もする・・・。 var world3 = context.Entry(castle) .Property( Location.ImaginaryWorld ) .CurrentValue; // プロパティの指定に文字列を使う。もっとも実用的かも。 // ただし、文字列を使ってプロパティのリフレクションを取得しているハズなので、パフォーマンスはよくない。 // ComplexTypeの階層構造を遡って行く事もできる。 var creator1 = context.Entry(castle) .ComplexProperty(c = c.Location) .ComplexProperty(l = l.ImaginaryWorld) .Property(w = w.Creator) .CurrentValue; var creator2 = context.Entry(castle) .Property(c = c.Location.ImaginaryWorld.Creator) .CurrentValue; var creator3 = context.Entry(castle) .Property( Location.ImaginaryWorld.Creator ) .CurrentValue; ComplexTypeを巡回する場合、ComplexTypeはDbPropertyValuesオブジェクトなので、次のような再帰呼び出しでダンプ可能。 public static void WritePropertyValues(string parentPropertyName, DbPropertyValues propertyValues) { foreach (var propertyName in propertyValues.PropertyNames) { var nestedValues = propertyValues[propertyName] as DbPropertyValues; // propertyNameが Location のプロパティはComplexTypeなので、DbPropertyValuesオブジェクトとなる。 if (nestedValues != null) { WritePropertyValues(parentPropertyName + propertyName + . , nestedValues); } else { Console.WriteLine( Property {0}{1} has value {2} , parentPropertyName, propertyName, propertyValues[propertyName]); } } } using (var context = new UnicornsContext()) { var castle = context.Castles.Find( The EF Castle ); WritePropertyValues( , context.Entry(castle).CurrentValues); } 関連 関連エンティティの積極的読み込み Includeを使って外部関連しているプロパティを同時に読み込むことができます。 var princesses1 = context.Princesses .Include(p = p.Unicorns) .ToList(); // Include()を使うと、Pricessの読み込み時に同時に関連するUnicornのを読み込みます。 var princesses2 = context.Princesses .Include( Unicorns ) .ToList(); // Includeにはプロパティ名を文字列で指定することもできる。 もちろん、積極的に外部関連エンティティを読みこまなくても遅延読み込みによってデータが読み込まれます。 関連エンティティの遅延読み込み 外部関連エンティティへのアクセス時にエンティティのデータをデータベースから読み込むことを遅延読み込みといいます。 EntityFrameworksで関連エンティティを遅延読み込み可能にするには、プロパティをvirtualで定義します。 public class Princess { public int Id { get; set; } public string Name { get; set; } public virtual ICollection Unicorns { get; set; } // 遅延読み込み可能 } 遅延読み込み無効化 すべての遅延読み込みが行われなくなります。 public class UnicornsContext DbContext { public UnicornsContext() { this.Configuration.LazyLoadingEnabled = false; } } ライフサイクル EntityState Added IDをまだ持っていないエンティティ。SaveChanges()ではInsert処理が行われ、キーカラムがAutoIncrement属性を持ったテーブルの場合、自動的にIDが作成され割り振られる。 Deleted Detached DbContextで管理されていないエンティティ。 Modified Unchanged DbContextにアタッチ済みのエンティティ。フィールド値の変更がない状態。 Detachedなオブジェクトも、DbSet.Attach()を使ってDbContextにアタッチしたオブジェクトとして使用することが可能です。 br もしくは、直接エンティティのStateをUnchangedに設定する方法が使えます。 var u = new Unicorn { Id = 1, Name = アタッチしました }; Console.WriteLine( Status= + context.Entry(u).State); // Detached context.Unicorns.Attach(u); // 推奨方法 // context.Entry(u).State = EntityState.Unchanged // ↑Stateに直接代入しても同じ効果を得られる。 Console.WriteLine( Status= + context.Entry(u).State); // Unchanged context.SaveChanges(); このとき、SaveChanges()の呼び出しによりId=1のレコードは更新されるため、上記のコードのUnicornはNameが「アタッチしました」に更新されてしまいます。 EntityState.Add このステータスを設定したエンティティは、SaveChanges()で新規レコードとしてテーブルに追加されます。 using (var context = new UnicornsContext()) { var unicorn = new Unicorn { Name = Franky , PrincessId = 1}; context.Entry(unicorn).State = EntityState.Added; // ライフサイクルステータスを「Added」に設定。 //context.Unicors.Add(unicorn); // 内部でStateをEntityState.Addedに設定している。 context.SaveChanges(); // Addedのエンティティを新規データとして処理する } 新規追加しようとするエンティティのキーフィールドに値が入っててもよい。 br キーのフィールド属性がAutoIncrementを設定してある場合は、自動的にIdを設定します。 Idがすでにデータベースに存在する場合、SaveChanges()でエラーが発生します。 using (var context = new UnicornsContext()) { var unicorn = new Unicorn { Id=1, Name = Franky , PrincessId = 1}; // すでに「Id=1」がデータベースに存在するとする。 context.Entry(unicorn).State = EntityState.Added; context.SaveChanges(); // 例外発生 // Id=1がすでにデータベースに存在するので、 // EntityState.Addedを設定したエンティティをテーブルに追加しようとして失敗する。 } EntityState.Detached DbContextで管理していないエンティティはすべてこのステータスとなります。 データベースに存在するキーを設定しても、エンティティのオブジェクトがDbContextで管理されていない(アタッチしていない)ため、EntityState.Detachedとなります。 var u1 = new Unicorn { Name = Toshiva }; Console.WriteLine( Status= + context.Entry(u1).State); // EntityState.Detached var u2 = new Unicorn { Id = 1, Name = LG }; // Id=1はデータベースに存在する Console.WriteLine( Status= + context.Entry(u2).State); // EntityState.Detached DbContextから切り離されたエンティティオブジェクトは外部参照のトラッキングは行いません。 var u1 = context.Unicorns.Find(1); Console.WriteLine(u1.Princess); // Princessを自動的に取得する var u2 = context.Unicorns.Find(2); context.Entity(u2).State = System.Data.EntityState.Detached; Console.WriteLine(u1.Princess); // Princessを自動的に取得できないため、Nullを返す。 ローカルデータ(未コミットデータ) DbContextが管理するエンティティはSaveChangedが呼び出されるまでデータベースに保存されません(永続化されない)。 このような永続化前のDbContextが持つデータをローカルデータと呼びます。 context.Unicorns.Load(); // Unicornすべてを読み込み context.Unicorns.Add(new Unicorn { Name = Linqy }); // 新しいUnicornを追加 // ただし、永続化はまだ行われていない。 context.Unicorns.Remove(context.Unicorns.Find(1)); // Unicornを削除 // ただし、永続化はまだ行われていない。 // ◆ローカルデータのダンプ Console.WriteLine( In Local ); foreach (var unicorn in context.Unicorns.Local) { Console.WriteLine( Found {0} {1} with state {2} , unicorn.Id, unicorn.Name, context.Entry(unicorn).State); } // ◆ 永続化済みデータのダンプ Console.WriteLine( In DbSet query ); foreach (var unicorn in context.Unicorns) { Console.WriteLine( Found {0} {1} with state {2} , unicorn.Id, unicorn.Name, context.Entry(unicorn).State); } In Local Found 0 Linqy with state Added Found 2 Silly with state Unchanged Found 3 Beepy with state Unchanged Found 4 Creepy with state Unchanged In DbSet query Found 1 Binky with state Deleted Found 2 Silly with state Unchanged Found 3 Beepy with state Unchanged Found 4 Creepy with state Unchanged 低レベルSQLの実行 SQLを直接実行することができます。 var unicorns = context.Unicorns.SqlQuery( select * from Unicorns ).ToList(); // Unicornクラスのオブジェクトを取得(エンティティ) var unicornNames = context.Database.SqlQuery( select Name from Unicorns ).ToList(); // エンティティ以外も取得可能。 // この場合、戻り値はstring型を要素に持つコレクションとなる。 context.Database.ExecuteSqlCommand( update Unicorns set Name = Franky where Name = Beepy ); // SELECT以外のSQLはExecuteSqlCommand()を使う。 参照 Using DbContext in EF4.1 EF4.1の使い方。EF4.3でも基本は同じ。 Walkthrough 既存のDBからのマイグレーション方法を解説したブログポスト。
https://w.atwiki.jp/lmes2/pages/122.html
.NET Frameworkクラス・ライブラリでファイル入出力 概要 Frameworkでファイル入出力を行う。 元ネタ: @IT総合トップ / テクノロジー / Insider.NET / 連載:VB.NETプログラミング / 第8回 ファイル入出力(後編) 前提条件 新しいwebサイトの作成 手順 default.aspx.vb を以下のように変更。 Imports System.IO Partial Class _Default Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim strPath As String = "test.txt" strPath = Server.MapPath(strPath) Dim writer As StreamWriter Dim reader As StreamReader ########################################################## ### 書き込み ########################################################## writer = New StreamWriter(strPath) writer.WriteLine("書き込まれます。") writer.Close() ########################################################## ### 読み込み ########################################################## reader = New StreamReader(strPath) Response.Write(reader.ReadLine()) reader.Close() End Sub End Class not found (236.jpg)
https://w.atwiki.jp/silver_emblem/pages/32.html
トップへ戻る Microsoft .NET Frameworkに関する情報のメモ 関連技術一覧 ※基本的にWikipediaからのパクリ文章なのは確定的に明らか WPF WCF WF WCS XAML LINQ SilverLight .NET Framework 4.0 ITPro トップへ戻る
https://w.atwiki.jp/makimaaki/pages/15.html
3.コーディングスタイル 見やすいプログラムかどうかは、コーディングスタイルで決まります。 メンテナンス性向上のためにも全員が守れるようにしましょう。 代入 変数に値を導入する際には、変数名とイコール、イコールと値の間には必ず空白を入れなければならない。通常は半角空白を1つとする。ただし、可読性向上のための複数の空白であれば、入れることを推奨。 計算式を代入する場合などは、各要素の間に空白を入れる 代入の例 $total = 1 + 2; //良い例 $total = $value1 + $value2; //良い例 $total = (1 + 2) * 2; //良い例 $total=1+2; //悪い例 $total = $value1+$value2; //悪い例 $total = ( 1 + 2 ) * 2; //悪い例 複数行の代入を揃える例 //良い例(下に合わせるため空白を入れた) $name = 山田太郎 ; $address = 東京都港区 ; //悪い例(イコールがずれ、見にくくなる) $name = 山田太郎 ; $address = 東京都港区 ; 文字列 文字列はリテラル(変数の展開などが含まれない)か否かに関わらず、「シングルクォート( )」で囲まなければならない 文字列中に改行を入れたい場合は、改行部分のみ「ダブルクォート(")」で囲み、「ドット(.)」で連結する 文字列の連結には「ドット(.)」を使用し、ドットの前後には常に空白を入れなければならない。複数行になる場合、二行目以降の変数名記述は不可。ドットを一行目のイコールと同じ位置にして連結する。 配列が改行で長くなる場合は、複数行の記述でも構わないが、二行目以降の開始位置は、array()の後ろに合わせる リテラル:最もシンプルな例。「シングルクォート」で囲む $greeting = こんにちは。 ; //良い例 $greeting = "こんにちは。"; //ダブルクォートは使わない 文字列の連結:文字列の連結には「ドット(.)」を使用。ドットの前後には常に空白を入れなければならない $greeting = こんにちは。 . 今日はいい天気ですね。 ; 連結が長くなる場合:複数行の記述でも構わないが、二行目以降の変数名の記述は不可。二行目以降のドットは一行目のイコールと同じ位置にする //良い例 $greeting = こんにちは。今日はいい天気ですね . でも夕方から雨が降るそうですよ ; //悪い例 変数名を複数回記述することで混乱の元になる恐れがある $greeting = こんにちは。今日はいい天気ですね ; $greeting .= でも夕方から雨が降るそうですよ ; 変数の展開:文字列中に変数を入れたい場合は、文字列の連結を使用。「ダブルクォート」を使用してはいけない $greeting = こんにちは、 . $name . さん。 ; //良い例 $greeting = こんにちは、 $name . さん。 ; //悪い例 $greeting = こんにちは、{$name}さん。 ; //悪い例 改行の使用:文字列中に改行を入れたい場合は、改行部分のみ「ダブルクォート」で囲み、連結する //良い例 $greeting = こんにちは。 . "\n" . 今日はいい天気ですね。 ; //悪い例 改行が分かりにくい $greeting = "こんにちは。\n今日はいい天気ですね。"; 配列が改行で長くなる場合:複数行の記述でも構わないが、二行目以降の開始位置は、array()の後ろに合わせる //良い例 $myArray = array(1, 2, 3, Zend , Framework , $value1, $value2, $value3, 100, 200, 300); //悪い例 区切りのカンマを行頭に書いてはいけない $myArray = array(1, 2, 3, Zend , Framework , $value1, $value2, $value3 , 100, 200, 300); 配列 通常配列 配列の添字に負の数を使用してはならない 特別な理由が無い限り0から始める array()を使用して数値添字の配列を宣言する場合は、要素を区切るカンマの後に空白を入れなければならない 通常配列の例 //良い例 $myArray = array(1, 2, 3, Zend , Framework ); //悪い例 要素を区切るカンマの後に空白がない $myArray = array(1,2,3, Zend , Framework ); //悪い例 カッコ内の前後に空白を入れてはいけない $myArray = array( 1, 2, 3, Zend , Framework ); 連想配列 連想配列をarray()で宣言する場合、1要素につき改行を入れなければならない 各要素の開始位置は揃えて記述する 連想配列の例 $myArray = array( firstKey = firstValue , secondKey = secondValue ); 要素が多い場合:終了のカッコをarrayの先頭に合わせる $myArray = array( firstKey = firstValue , secondKey = secondValue thirdKey = thirdValue fourthKey = fourthValue fifthKey = fifthValue ); 条件分岐(if/else/else if) 条件を指定するカッコ前およびカッコを閉じた後に、それぞれ空白を入れなければならない 条件文の中では演算子の前後にも空白を入れる 条件分岐開始の中カッコ({)は条件文と同じ行に書き、終了の中カッコ({)は改行して書かなければならない 中カッコ内では「半角空白4文字分の字下げ」を行う 「elseif」は使用しない。「else if」(「else」と「if」の間に空白を入れる)を使用する 条件が一つの場合 //良い例 if ($age 20) { echo 未成年です。 ; } //悪い例 (条件を指定するカッコ前およびカッコを閉じた後のそれぞれ空白や演算子前後の空白が無い) if($age 20){ echo 未成年です。 ; } //悪い例 (演算子前後の空白が無い) if ($age 20) { echo 未成年です。 ; } //悪い例 (条件を指定するカッコ前およびカッコを閉じた前にも空白を入れてしまっている) if ( $age 20 ) { echo 未成年です。 ; } //悪い例 (改行がない) if ($age 20) { echo 未成年です。 ; } //悪い例 (改行位置が違う) if ($age 20) { echo 未成年です。 ; } 条件分岐が続く例 //良い例 if ($age 20) { echo 未成年です。 ; } else if ($age 30) { echo 20代です。 ; } else { echo 30代です。 ; } //悪い例 (elseifは使わない) if ($age 20) { echo 未成年です。 ; } elseif ($age 30) { echo 20代です。 ; } else { echo 30代です。 ; } 選択分岐(switch) 条件を指定するカッコ前およびカッコを閉じた後に、それぞれ空白を入れなければならない switchの中は「半角空白4文字分の字下げ」を行い、さらにcaseの中は「半角空白4文字分の字下げ」を行う 開始の中カッコ({)はswitchと同行に書き、終了の中カッコ(})は改行して書かなければならない defaultは決して省略してはならない switchの例 //良い例 switch ($weather) { case fine echo いい天気ですよ! ; break; case cloudy echo ちょっと曇ってますね。 break; case rainy echo 傘は必須です。 break; default //何もなくても省略してはいけない break; } //悪い例(空白行がないと見にくい) switch ($weather) { case fine echo いい天気ですよ! ; break; case cloudy echo ちょっと曇ってますね。 break; case rainy echo 傘は必須です。 break; default //何もなくても省略してはいけない break; } //悪い例 (defaultは省略不可) switch ($weather) { case fine echo いい天気ですよ! ; break; case cloudy echo ちょっと曇ってますね。 break; case rainy echo 傘は必須です。 break; } //悪い例(caseの中はインデントが必要) switch ($weather) { case fine echo いい天気ですよ! ; break; case cloudy echo ちょっと曇ってますね。 break; (後略) //悪い例 (case自体もインデントが必要) switch ($weather) { case fine echo いい天気ですよ! ; break; case cloudy echo ちょっと曇ってますね。 break; (後略) //悪い例 (開始の中カッコは switch と同行に書く) switch ($weather) { case fine echo いい天気ですよ! ; break; (後略) //悪い例 (カッコの前とカッコ終了の後には空白が必要) switch($weather){ case fine echo いい天気ですよ! ; break; (後略) //悪い例 (カッコの中は空白禁止) switch ( $weather ) { case fine echo いい天気ですよ! ; break; (後略) 繰り返し(while) 条件を指定するカッコ前およびカッコを閉じた後に、それぞれ空白を入れなければならない whileの中は「半角空白4文字分の字下げ」を行う 開始の中カッコ({)は、whileと同じ行に書き、終了の中カッコ(})は改行して書かなければならない whileの例 // 良い例 while ($i 10) { echo $i . 回目の出力です。 ; $i++; } //悪い例(まったく空白が入っていない) while($i 10){ echo $i . 回目の出力です ; $i++; } //悪い例(カッコ内に演算子の前後には空白が必要) while ($i 10) { echo $i . 回目の出力です ; $i++; } //悪い例(カッコの中は空白禁止) while ( $i 10 ) { echo $i . 回目の出力です ; $i++; } //悪い例(中カッコの開始はwhileと同行にしなければならない) while ($i 10) { echo $i . 回目の出力です ; $i++; } 繰り返し(for) 条件式を指定するカッコ前およびカッコを閉じた後に、それぞれ空白を入れなければならない forの中は「半角空白4文字分の字下げ」を行う 開始の中カッコ({)はforと同じ行に書き、終了の中カッコ(})は改行して書かなければならない 条件式の各要素のセミコロン(;)の後には空白を入れる 条件式の各要素に演算子が入っている場合は、その前後に空白を入れなければならない forの例 //良い例 for ($i = 0; $i 10; $i++) { echo $i . 回目の出力です。 ; } //悪い例(条件式の演算子の前後やセミコロンの後に空白を入れなければならない) for ($i=0;$i 10;$i++) { echo $i . 回目の出力です。 ; } //悪い例(条件式の前後に空白を入れてはいけない) for ( $i = 0; $i 10; $i++ ) { echo $i . 回目の出力です。 ; } //悪い例(中カッコの開始は while と同行にする) for ( $i = 0; $i 10; $i++ ) { echo $i . 回目の出力です。 ; } for文は配列の要素数分ループさせるなどで利用する事が多いですが、配列の要素数の取得を条件式に入れてはなりません。これは、ループするたびに配列の要素数を取得する処理が実行されてしまうからです 条件式では関数を呼び出してはならない // 良い例 $cnt = count($data); for ($i = 0; $i $cnt; $i++) { echo $data[$i]; } //悪い例(条件式内で関数呼び出しをしてはいけない) for ($i = 0; $i count($data); $i++) { echo $data[$i]; } 関数の使用 関数名とカッコの間に空白は入れてはならない 引数が複数ある場合は、引数の区切りのカンマの後に空白を入れる 関数の例1 //良い例 $outData = htmlspecialchars($message); //悪い例(関数とカッコの間に空白を入れてはならない) $outData = htmlspecialchars ($message); //悪い例(引数のカッコ内に空白を入れてはいけない) $outData = htmlspecialchars( $message ); 関数の例2 //良い例 $aList = explode( - , $tel); //悪い例(関数とカッコの間に空白を入れてはならない) $aList = explode( - , $tel); //悪い例(引数と引数の間には空白が必要) $aList = explode( - ,$tel); //悪い例(引数のカッコ内に空白を入れてはいけない) $aList = explode( - , $tel ); 関数の宣言 関数を宣言する場合は、関数内とカッコの間に空白を入れてはいけない 引数が複数ある場合は、引数の区切りのカンマの後に空白を入れる 関数の中は「半角空白4文字分の字下げ」を行う 開始の中カッコ({)は関数名と同じ行に書き、終了の中カッコ(})は改行して書く 関数の宣言の例 //良い例 function myFunc($param1, $param2) { $total = $param1 + $param2; return $param; } //悪い例(関数内は半角空白4文字分の字下げが必要) function myFunc($param1, $param2) { $total = $param1 + $param2; return $param; } //悪い例(引数の間に空白がない、引数の同じカッコの後に空白がない) function myFunc($param1,$param2){ $total = $param1 + $param2; return $param; } //悪い例(関数名の後に空白をいれてはいけない) function myFunc ($param1, $param2) { $total = $param1 + $param2; return $param; } //悪い例(中カッコの開始は関数名と同行でなければならない) function myFunc($param1, $param2) { $total = $param1 + $param2; return $param; } //悪い例(return する値をカッコで囲んではいけない) function myFunc($param1, $param2) { $total = $param1 + $param2; return ($param); } クラスの宣言 クラスの宣言の開始の中カッコはクラス名の下に書かなければならない(one true brace形式) 終了の中カッコ(})は改行して書く クラス内は全て「半角空白4文字分の字下げ」を行う クラスの宣言の例 //良い例 class MyClass { //クラス内は半角空白4文字分の字下げが必要 } クラスのメンバー変数の宣言 クラス内で宣言される全てのメンバー変数は、クラス開始の中カッコの事業にまとめて書かなければならない メンバー変数は適切なアクセス権限(「private」「public」「protected」)で宣言する !!基本は「private」です。外部からメンバー変数に代入させたい場合は「public」にして直接代入するのではなく、アクセサ(set/get)を使用してください。 クラスのメンバー関数宣言の例 //良い例 class MyClass { private $_variable1; //良い例 public $_variable2; //良い例 protected $_variable3; //良い例 var $variable3; //エラーにはならないが悪い例 } クラスのメンバー関数の宣言 クラスのメンバー関数宣言の開始の中カッコ({)はメンバー関数名の下に書かなければならない(one true brace形式) 終了の中カッコ(})は改行して書く メンバー関数内は全て「半角空白4文字分字下げ」を行う メンバー関数名と引数の開始カッコの間に空白は入れてはいけない クラスの宣言の例 //良い例 class MyClass { private function myFunc($param1, $param2) { $total = $param1 + $param2; return $param; } } コメント コメント記号の後に必ず空白を入れなければならない 複数行コメントの場合はコメント開始記号の行と終了記号の行には他の文字を書いてはならない コメントの例 //一行コメント ←良い例 //一行コメント ←悪い例 //良い例 /* これは 複数行コメントです */ // 悪い例 /* これは 複数行コメントです。 */ // 悪い例 /*これは複数行コメントです。*/ プログラム中のSQL文の記述 SQL文内にシングルクォートが含まれるためシングルクォートではなくダブルクォートで囲む SQL構文や関数は、大文字で記述する 可読性を良くする為、適切にインデントを行う プレースホルダを使う場合はmシングルクォートで囲む SQL文の例 //良い例 $sql = "SELECT " . "id, " . "name " ."FROM " . "m_user " ."WHERE " . "group = 開発部 "; //良い例 (プレースホルダを使う場合) $sql = SELECT . id, . name . FROM . m_user . WHERE . group = ? ; //悪い例(1行で書いている) $sql = "SELECT id, name FROM m_user WHERE group = 開発部 "; //悪い例(SQL構文を小文字で書いている) $sql = "select " . "id, " . "name " ."from " . "m_user " ."where " . "group = 開発部 "; //悪い例(カンマを頭に持ってきている) $sql = "SELECT " . "id " . ",name " ."FROM " . "m_user " ."WHERE " . "group = 開発部 "; //悪い例(インデントしていない) $sql = "SELECT " . "id, " . "name " . "FROM " . "m_user " . "WHERE " . "group = 開発部 ";
https://w.atwiki.jp/sevenlives/pages/961.html
ノータッチ・デプロイメント
https://w.atwiki.jp/riscster/pages/6.html
デストラクタ・ファイナライザ ハッシュ・チェックサム ストリーム 圧縮・解凍 暗号化・復号化 コントロール ファイル・ディレクトリ DirectX データベース パーサ
https://w.atwiki.jp/wiki5_orbit/pages/16.html
nlite雑記 参考サイト http //linkage.xrea.jp/ http //www4.zero.ad.jp/Angel.Omega/nLite.htm http //www.geocities.com/wxp_2004/html/xp_auto.htm http //kobe.cool.ne.jp/memoba/memo/w_sp.htm#2k
https://w.atwiki.jp/hfslip_ja/pages/24.html
Windows XP SP2へWindows Media Player 11を MSOOBE 問題 Microsoft Out-Of-Box-Experience (MSOOBE)アプリケーションの問題で、WMP11を統合すると Windowsセットアップがユーザ名入力、ファイアウォールの設定、Microsoftへのユーザ登録などを行うポストインストールウィザードを表示しません。この問題を回避するために、WindowsXP-KB898543-v3-x86-ENG.exeをダウンロードし、HFフォルダに入れて下さい、これは英語版のみ入手可能です。 もしソースが英語ソースではないならば、HFSLIPはmsobmain.dllのみを統合し、問題が起こる可能性を回避します。msobmain.dllはMSOOBE問題を修正するのに必要である唯一のファイルです。これが英語のアップデートであるので、最終的な再起動後に"Please wait..."というテキストが大きなWindowsロゴの下に表示されます。 WindowsXP-KB894871-x86- LNG .exe もまたMSOOBEアプリケーションのアップデートです。これは他の言語用のものも存在します、しかし、公に公開された修正ではありません。Microsoftに電話して入手する必要があります。 もし、KB898543-v3 and KB894871 (選択した言語の) 両方とも自由に使え、英語ソースを使用しているならば、両方ともHFSLIPで統合出来ます。 以上のように、HFSLIPは英語版でないソースであれば、KB894871アップデータを統合し、KB988543-v3アップデートからmsobmain.dllのみを統合します。上記のように、HFSLIPは英語版でないソースならばKB898543-v3からはmsobmain.dllのみを統合します。したがって、KB894871にはより新しいバージョンのmsobmain.dllを含んでいるので、KB898543-v3を同時に使用するのは無意味です。もし英語でないソースを使用するのならば、KB894871のみを利用して下さい。 WMP11に適用されないアップデートと修正 HMTCDWizard_jpn.exe MP10Setup.exe wmfdist95.exe wmcsetup.exe WindowsMedia-KB891122-x86-JPN.exe Media9/10 用修正 重要なメモ もしホストOSがWindows2000であり、英語版WMP11の実行ふぃあるを使うなら、HFSLIPの実行前に新しいフォルダにWinRARや7zip等を用いてインストーラを解凍しなければなりません。なぜなら、それはWindows2000のDOSプロンプトでは解凍出来ないからです。ローカライズされたWMP11インストーラはこの問題が起こりません。新しいフォルダはWMP11と名付け、HFフォルダに置く必要があります。 もしホストOSがWindows XPかWindows Server 2003ならば、まだ実行ファイルをHF\WMP11に解凍することが出来ますが、その必要は有りません。もっとも、それが有れば、HFSLIPはそちらを使うので、HFSLIPの実行速度を上げることが出来ます。